首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏小许code

    Go 指针、uintptr、unsafe.Pointer之间如何转换

    想取值需要转成unsafe.Pointer后, 需再转到相对应的指针类型。源代码中的定义如下。 //uintptr是一个能足够容纳指针位数大小的整数类型type uintptr uintptrunsafe.Pointer​编辑unsafe.Pointer功能介绍unsafe.Pointer定义如下 type Pointer *ArbitraryTypetype ArbitraryType int​编辑unsafe.Pointer作为桥梁实现相互转换 unsafe.Pointer在unsafe包中还有以下几个函数在我们计算可能会用到 (unsafe.Pointer(p)) 获取了 w 的指针起始值//unsafe.Offsetof(w.p) 获取 b 变量的偏移量uintptr和unsafe.Pointer的转换同样举个栗子,结合上面的 var p = &Peopleheight := unsafe.Pointer(uintptr(unsafe.Pointer(p)) + unsafe.Offsetof(p.height))*((*int

    2K50编辑于 2023-02-07
  • 来自专栏Go语言指北

    Go通关17:Go指针和unsafe.Pointer有什么区别?

    您诸位好啊,我是无尘,又到周末了,放松之余别忘了“卷”篇文章哟~ 指针类型转换 在 Go 语言中,处于安全考虑,是不允许两个指针类型进行转换的,比如 *int 不能转为 *float64。 如果你非要~,那么 Go 提供了 unsafe 包,使用包里的 Pointer 来进行转换! unsafe.Pointer unsafe.Pointer 是一种特殊意义的指针,可以表示任意类型的地址。 not actually part of the unsafe package. // It represents the type of an arbitrary Go expression. type 如果要进行指针运算,要先通过 unsafe.Pointer 转换为 uintptr 类型的指针。 、unitptr *T ←互转→ unsafe.Pointer ←互转→ unitptr unsafe.Pointer 主要用于指针类型的转换,是各个指针类型转换的桥梁。

    46940发布于 2021-08-18
  • 来自专栏学院君的专栏

    Go 数据类型篇(八):指针使用入门与 unsafe.Pointer

    语言中的指针不同,Go 语言中的类型指针不能进行偏移和运算,因此更为安全。 二、基本使用 下面我们以一个简单的示例代码来演示 Go 语言中指针的基本使用。 Go 官方文档对这个类型有如下四个描述: 任何类型的指针都可以被转化为 unsafe.Pointerunsafe.Pointer 可以被转化为任何类型的指针; uintptr 可以被转化为 unsafe.Pointer 这个示例说明了 unsafe.Pointer 是一个万能指针,可以在任何指针类型之间做转化,这就绕过了 Go 的类型安全机制,所以是不安全的操作。 uintptr 是 Go 内置的可用于存储指针的整型,而整型是可以进行数学运算的!

    1.2K20编辑于 2023-03-03
  • 来自专栏sunsky

    你不知道的Go unsafe.Pointer uintptr原理和玩法

    unsafe.Pointer 这个类型比较重要,它是实现定位和读写的内存的基础,Go runtime大量使用它。 //是一种牺牲空间换取时间的做法, 我们一定要注意不要浪费空间, //struct类型定义的时候一定要将占用内从空间小的类型放在前面, 充足利用padding, 才能提升内存、cpu效率 } go run PLAY.go unsafe.Pointer *uint64 unsafe.Pointer *uint64 0x402699999999999a 0b100000000010000000000000000000000000000000000000000000000000000 unsafe是不安全的,所以我们应该尽可能少的使用它,比如内存的操纵,这是绕过Go本身设计的安全机制的,不当的操作,可能会破坏一块内存,而且这种问题非常不好定位。 还有,整个unsafe包都是用于Go编译器的,不用运行时,在我们编译的时候,Go编译器已经把他们都处理了。

    2K10发布于 2020-08-20
  • 深入浅出:Go语言中的unsafe.Pointer与uintptr

    在日常的Go语言开发中,我们大多数时候都在与类型安全的代码打交道。但当你需要与底层系统交互、进行高性能优化或处理特殊场景时,就不得不接触Go语言中的"禁区"——unsafe包。 unsafe.PointerGo语言中的一种特殊指针类型,它可以指向任意类型的变量。你可以把它理解为Go语言中的"void "指针,就像C语言中的void一样。 在Go语言中,普通指针(如*int、*string)之间不能直接转换,但通过unsafe.Pointer这个桥梁,我们可以实现指针类型的转换。 什么是uintptr? 转换规则与指针运算 Go语言不允许直接进行指针运算,但通过结合使用unsafe.Pointer和uintptr,我们可以绕过这个限制: type Person struct { Name string 写在最后 unsafe.Pointer和uintptr是Go语言底层编程的重要工具。unsafe.Pointer是一个通用指针类型,用于不同类型的指针转换;uintptr是一个整数类型,用于指针运算。

    12110编辑于 2026-01-27
  • 来自专栏涓流

    unsafe.Pointer与uintptr

    uintptr 可以转换为 unsafe.Pointer(因为 uintptr 存储的是内存地址,因此只要封装一下就可以变成指针,即 unsafe.Pointerunsafe.Pointer 可以转换为 : unsafe.Pointer(ip) 将 *int 指针 ip 转换为 unsafe.Pointer 类型的指针 uintptr(unsafe.Pointer(ip)) 将 unsafe.Pointer 16,得到新的内存地址值 unsafe.Pointer(uintptr(unsafe.Pointer(ip)) + 16) 将新的内存地址进行封装,转换为 unsafe.Pointer (*int)( unsafe.Pointer(uintptr(unsafe.Pointer(ip)) + 16)) 将新的 unsafe.Pointer 指针转换为 *int 类型的指针 unsafe.Pointer (n.j))) *njPointer = 2 fmt.Println(n) // {煎鱼 2} } 参考资料: go 指针

    27010编辑于 2024-11-29
  • 来自专栏我的独立博客

    golang unsafe.Pointer与uintptr

    理论上说指针不过是一个数值,即一个uint,但实际上在gounsafe.Pointer是不能通过强制类型转换为一个uint的,只能将unsafe.Pointer强制类型转换为一个uintptr。 12 *pAge = 12 fmt.Println(p) } 打印结果为: $ go run main.go &{张三 0} &{李四 12} 需要注意的是下面这段代码比较长: pAge := ( 关于Go的内存管理可以参看这篇文章:https://draveness.me/golang/docs/part3-runtime/ch07-memory/golang-memory-allocator/ 除了上面两点外还有一个原因是在Go 1.3上,当栈需要增长时栈可能会发生移动,对于下面的代码: var obj int fmt.Println(uintptr(unsafe.Pointer(&obj)) 参考资料 Go语言实战笔记(二十七)| Go unsafe Pointer garbage collection - Does Go guarantee constant addresses?

    40210编辑于 2024-09-02
  • 来自专栏菜皮日记

    Go 中普通指针、unsafe.Pointer 与 uintptr 之间的关系和指针运算

    Go 指针运算 在 Go 中默认的普通指针也是指代的是一个内存地址,值类似 0x140000ac008,但 Go 的普通指针不支持指针运算的,例如对指针做加法会报错: a := 10 var p *int = &a p = p + 1 报错 invalid operation: p + 1 (mismatched types *int and untyped int) 但 Go 还是提供了一种直接操作指针的方式 赋值给 height 变量 // 所以现在 height 的类型是 unsafe.Pointer height := unsafe.Pointer(uintptr(unsafe.Pointer(people (&byteSlice[0])) fmt.Println(floatSlice) } 输出 &[1] 这个过程不需要 Go 的类型检查,绕过了很多流程,相对来说性能会更高。 unsafe 允许你直接操作内存,可以用来实现一些 Go 的标准库中没有的数据结构。 反射: 与反射结合时,unsafe 可以用于访问结构体的私有字段。

    49610编辑于 2023-12-18
  • 来自专栏我的小碗汤

    Go里面的unsafe包详解

    但是借助unsafe.Pointer,我们可以打破Go类型和内存安全性,并使上面的转换成为可能。这怎么可能发生? 因此,资源在unsafe包中的作用是为Go编译器服务,unsafe.Pointer类型的作用是绕过Go类型系统和内存安全。 团队的核心成员之一,已经确认: 在unsafe包中的函数的签名将不会在以后的Go版本中更改, 并且unsafe.Pointer类型将在以后的Go版本中始终存在。 = uintptr(unsafe.Pointer(pa)) p1 := unsafe.Pointer(ptr + unsafe.Sizeof(pa[0])) // "go vet" will make 使用unsafe.Pointer并不总是一个坏主意,有时我们必须使用它。 Golang的类型系统是为了安全和效率而设计的。 但是在Go类型系统中,安全性比效率更重要。

    1.3K40发布于 2018-08-22
  • 来自专栏golang问题合集

    golang面试题:怎么避免内存逃逸?

    //go:nosplit func noescape(p unsafe.Pointer) unsafe.Pointer { x := uintptr(p) return unsafe.Pointer "unsafe")type A struct { S *string}func (f *A) String() string { return *f.S}type ATrick struct { S unsafe.Pointer (&s))}}func noescape(p unsafe.Pointer) unsafe.Pointer { x := uintptr(p) return unsafe.Pointer(x ^ 0)} 代码的最后一行返回 unsafe.Pointer 也是一个 int。noescape() 在 runtime 包中使用 unsafe.Pointer 的地方被大量使用。 如果作者清楚被 unsafe.Pointer 引用的数据肯定不会被逃逸,但编译器却不知道的情况下,这是很有用的。面试中秀一秀是可以的,如果在实际项目中如果使用这种unsafe包大概率会被同事打死。

    26400编辑于 2023-12-21
  • 来自专栏golang小白成长记

    golang面试题:怎么避免内存逃逸?

    //go:nosplit func noescape(p unsafe.Pointer) unsafe.Pointer { x := uintptr(p) return unsafe.Pointer type A struct { S *string } func (f *A) String() string { return *f.S } type ATrick struct { S unsafe.Pointer (&s))} } func noescape(p unsafe.Pointer) unsafe.Pointer { x := uintptr(p) return unsafe.Pointer(x 代码的最后一行返回 unsafe.Pointer 也是一个 int。 noescape() 在 runtime 包中使用 unsafe.Pointer 的地方被大量使用。 如果作者清楚被 unsafe.Pointer 引用的数据肯定不会被逃逸,但编译器却不知道的情况下,这是很有用的。 面试中秀一秀是可以的,如果在实际项目中如果使用这种unsafe包大概率会被同事打死。

    89010发布于 2021-03-03
  • 来自专栏乌鸦安全

    自写go加载器加壳免杀——过国内主流杀软

    本文作者:zedxx10师傅 01免杀编写说明 ‍‍‍参考自己公司大佬写的go木马中的内存保护 必须对Windows一些重要dll 和 go语言的指针有所了解(重 要 ! 加载运行 03shellcode实现 讲 解 1. go语言编写的基本原则 go语言必要的 package main以及func main 主函数 package main func main() { } 基本的go结构:所有的函数都从main函数开始加载,如果没有放入函数,则不会执行该函数。 将你保护代码放入你的定义函数之中 这里涉及go语言指针,简单的说一下指针,可能讲的会有些模糊。 指针是一个地址传递的,地址传递会发生内存地址的改变。 但是这个和值传递不同有所不同。 ,我们需要进行编译,编译方法如下: 找到你的go语言所在路径 cmd 使用 go build main.go 此时会编译生成一个main.exe (火绒会报毒 ) 05加 壳 免 杀 免杀还是采用加壳

    5.2K40发布于 2021-11-16
  • 来自专栏solate 杂货铺

    go unsafe 包

    go unsafe 包 unsafe包是不安全的,可以绕过go内存安全机制,直接对内存进行读写。 指针转换 go 语言是强类型的,所以一般情况不允许不同类型指针进行转换 func main() { i:= 10 ip:=&i var fp *float64 = (*float64)(ip) It represents the type of an arbitrary Go expression. type ArbitraryType int type Pointer *ArbitraryType builtin.go 包中,是一种类型 // uintptr is an integer type that is large enough to hold the bit pattern of // 指针运算的核心在于它操作的是一个个内存地址,通过内存地址的增减,就可以指向一块块不同的内存并对其进行操作,而且不必知道这块内存被起了什么名字(变量名) 指针转换规则 Go 语言中存在三种类型的指针: 常用的

    74210编辑于 2022-05-09
  • 来自专栏码农桃花源

    深度解密Go语言之unsafe

    直到我开始接触 Go 语言,又找到了那种感觉。Go 语言的作者之一 Ken Thompson 也是 C 语言的作者。所以,Go 可以看作 C 系语言,它的很多特性都和 C 类似,指针就是其中之一。 Go 还有非类型安全的指针,这就是 unsafe 包提供的 unsafe.Pointer。在某些情况下,它会使代码更高效,当然,也更危险。 unsafe 包用于 Go 编译器,在编译阶段使用。 在 /usr/local/go/src/cmd/compile/internal/gc/unsafe.go 路径下,可以看到编译期间 Go 对 unsafe 包中函数的处理。 func main() { p := Programmer{"stefno", 18, "go"} fmt.Println(p) lang := (*string)(unsafe.Pointer 这样,通过 uintptr 和 unsafe.Pointer 的结合就解决了 Go 指针不能进行数学运算的限制。

    81310发布于 2019-06-03
  • 来自专栏golang问题合集

    golang⾯试题:能说说uintptr和unsafe.Pointer的区别吗?

    问题能说说uintptr和unsafe.Pointer的区别吗? 怎么答unsafe.Pointer只是单纯的通用指针类型,用于转换不同类型指针,它不可以参与指针运算;而uintptr是用于指针运算的,GC 不把 uintptr 当指针,也就是说 uintptr 无法持有对象 , uintptr 类型的目标会被回收;unsafe.Pointer 可以和 普通指针 进行相互转换;unsafe.Pointer 可以和 uintptr 进行相互转换。 "fmt""unsafe")type W struct {b int32c int64}func main() {var w *W = new(W)fmt.Println(w.b, w.c)b := unsafe.Pointer (uintptr(unsafe.Pointer(w)) + unsafe.Offsetof(w.b))*((*int)(b)) = 10fmt.Println(w.b, w.c)}//uintptr(unsafe.Pointer

    23200编辑于 2023-12-27
  • 来自专栏技术研究和应用

    Go逃逸分析

    类似的函数还有以下这些://go:noescapefunc mapaccess(t *rtype, m unsafe.Pointer, key unsafe.Pointer) (val unsafe.Pointer )//go:noescapefunc mapaccess_faststr(t *rtype, m unsafe.Pointer, key string) (val unsafe.Pointer)//go :noescapefunc mapassign(t *rtype, m unsafe.Pointer, key, val unsafe.Pointer)//go:noescapefunc mapassign_faststr (t *rtype, m unsafe.Pointer, key string, val unsafe.Pointer)//go:noescapefunc mapdelete(t *rtype, m unsafe.Pointer , key unsafe.Pointer)若直接对普通的Go函数加上此指令,则会出现如下错误.

    66071编辑于 2022-09-06
  • 来自专栏Golang语言社区

    Go语言学习之cgo(golang与C语言相互调用)

    C之于Go,好比汇编之于C。 2、嫌Go内存GC性能不足,自己手动管理应用内存。 3、实现一些库的Go Wrapper。 unsafe.Pointer 可以和 普通指针 进行相互转换。 unsafe.Pointer 可以和 uintptr 进行相互转换。 也就是说 unsafe.Pointer 是桥梁,可以让任意类型的指针实现相互转换,也可以将任意类型的指针转换为 uintptr 进行指针运算。 而void比较特殊,用Go中的unsafe.Pointer表示。任何类型的指针值都可以转换为unsafe.Pointer类型,而unsafe.Pointer类型值也可以转换为任意类型的指针值。 unsafe.Pointer还可以与uintptr这个类型做相互转换。由于unsafe.Pointer的指针类型无法做算术操作,转换为uintptr后可进行算术操作。

    3.3K70发布于 2018-03-27
  • 来自专栏网管叨bi叨

    Go指针的使用限制和突破之路

    除了常规的指针外,Go 语言在 unsafe 包里其实还通过 unsafe.Pointer 提供了通用指针,通过这个通用指针以及 unsafe 包的其他几个功能又让使用者能够绕过 Go 语言的类型系统直接操作内存进行例如 代表一个任意Go表达式类型。Pointer是int指针类型的一个别名,在 Go 中可以把任意指针类型转换成unsafe.Pointer类型。 // uintptr、unsafe.Pointer和普通指针之间的转换关系 uintptr <==> unsafe.Pointer <==> *T uintptr uintptr是 Go 语言的内置类型 还有一点要注意的是,uintptr 并没有指针的语义,意思就是存储 uintptr 值的内存地址在Go发生GC时会被回收。而 unsafe.Pointer 有指针语义,可以保护它不会被垃圾回收。 参考资料 深度解密Go语言之unsafe unsafe.Pointer 和 uintptr :https://www.cnblogs.com/echojson/p/10743530.html “看到这里了

    1.2K20发布于 2021-01-13
  • 来自专栏福大大架构师每日一题

    请用go语言调用libx265.dl

    请用go语言调用libx265.dll,将yuv文件编码成h265文件。 答案2023-03-08: 使用 github.com/moonfdd/x265-go 库,代码写在了这个库里。 执行命令: go run . /examples/simplest_x265_encoder/main.go 参考了[雷霄骅的基于libx265的视频编码器](https://github.com/leixiaohua1020/simplest_encoder simplest_x265_encoder.cpp package main import ( "fmt" "os" "unsafe" "github.com/moonfdd/ffmpeg-go /ffcommon" "github.com/moonfdd/x265-go/libx265" "github.com/moonfdd/x265-go/libx265common" ) func

    25410编辑于 2023-06-08
  • 来自专栏开发语言-Go

    Go语言学习10-指针类型

    引言书接上篇,Huazie 带大家了解了Go语言的《结构体类型》,本篇将要介绍Go语言的指针类型。主要内容指针是一个代表着某个内存地址的值。这个内存地址往往是在内存中存储的另一个变量的值的起始位置。 Go语言既没有像Java语言那样取消了代码对指针的直接操作的能力,也避免了 C/C++ 语言中由于对指针的滥用而造成的安全和可靠性问题。Go语言的指针类型指代了指向一个给定类型的变量的指针。 如下有4个与 unsafe.Pointer 类型相关的特殊转换操作:(1) 一个指向其他类型的指针值都可以被转换为一个 unsafe.Pointer 类型值。 例如:uptr := uintptr(pointer)注意:正是因为这些特殊的转换操作,unsafe.Pointer 类型可以使程序绕过Go语言的类型系统并在任意的内存地址上进行读写操作成为可能。 &s.f))结语Go数据类型的知识就记到这,下一篇介绍 Go语言数据的使用。

    26311编辑于 2024-10-07
领券